#pragma once

#include "common.h"
#include "locomotives.hpp"
#include "railroad_car.hpp"
#include "route.hpp"
#include <vector>

enum TRAIN_STATE {
    STOP=0b00100,
    RUNNING=0b11000,
    ACCELERATING=0b11001,
    EVEN_SPEED=0b11010,
    BRAKING=0b11011,
    WAITING=0b11100,
};

#define IS_TRAIN_STATE_RUNNING(x) (x & 0b11000) == 0b11000

// 火车的动态属性
class TrainDynamicProperties {
public:
    fp_type speed;        // 速度， 单位km/h
    fp_type acceleration; // 加速度，单位m/s^2
    fp_type mass;         // 质量，单位t
    fp_type distance;     // 距离，单位m
    fp_type targetSpeed;  // 目标速度，单位km/h
    fp_type direction;    // 0:正向，1:反向
    fp_type length;       // 火车长度（m）
    fp_type
        currCycPwrCons; // 当前能源计算周期中，火车消耗的能源，单位kWh。每次结算后会将这个量清零。
    TRAIN_STATE state;  // 火车状态
};

class Train {
public:
    std::vector<Locomotive *>
        locomotives; // The locomotives that this train is using
    std::vector<RailroadWagon *> wagons; // The wagons that this train is using
    TrainDynamicProperties trainDynamics;
    Route *route;

    Train(std::vector<Locomotive *> locomotives,
          std::vector<RailroadWagon *> wagons);
    void setRoute(Route *route);
    void update();
    fp_type calcAcceleration();
    // 最大牵引力，单位kN
    fp_type maxTraction();
    // 总摩擦力，单位kN
    fp_type totalFriction();
    // 获取最大功率 TODO：重命名！
    fp_type getPower();
    // 获取长度
    fp_type getLength(){return trainDynamics.length;};
private:
    // 计算列车的长度
    // 只在创建时计算一次
    fp_type calcLength();
    // 状态处于Running时的更新流程
    void runningStatusStep();
};
